package middleware

import (
	"go.uber.org/zap"
	"go.uber.org/zap/zapcore"
	"gopkg.in/natefinch/lumberjack.v2"
	"io"
	"os"
)

var SugarLogger *zap.SugaredLogger

func InitLoggerOld() {
	//我们将使用zap.New(…)方法来手动传递所有配置，而不是使用像zap.NewProduction()这样的预置方法来创建logger。
	//zapcore.Core需要三个配置——Encoder，WriteSyncer，LogLevel。
	writerSyncer := getLogWriter()
	encoder := getEncoder()
	core := zapcore.NewCore(encoder, writerSyncer, zapcore.DebugLevel)

	//AddCallerSkip
	//当我们不是直接使用初始化好的logger实例记录日志，而是将其包装成一个函数等，此时日录日志的函数调用链会增加，想要获得准确的调用信息就需要通过AddCallerSkip函数来跳过。
	logger := zap.New(core, zap.AddCaller(), zap.AddCallerSkip(1))
	SugarLogger = logger.Sugar()
}

// 有时候我们除了将全量日志输出到xx.log文件中之外，还希望将ERROR级别的日志单独输出到一个名为xx.err.log的日志文件中。我们可以通过以下方式实现。
func InitLogger() {
	encoder := getEncoder()
	// zap.log 记录全量日志
	logF := getLogWriter()
	c1 := zapcore.NewCore(encoder, logF, zapcore.DebugLevel)
	// zap.err.log 记录error级别的日志
	errF := getLogWriterErr()
	c2 := zapcore.NewCore(encoder, errF, zapcore.ErrorLevel) //Error级别之上的日志会写入到这里 例如Error和Fatal和panic
	// 使用NewTee将c1和c2合并到NewTee
	core := zapcore.NewTee(c1, c2)

	logger := zap.New(core, zap.AddCaller(), zap.AddCallerSkip(1))
	SugarLogger = logger.Sugar()
}

// 1.Encoder:编码器(如何写入日志)。
func getEncoder() zapcore.Encoder {
	encoderConfig := zap.NewProductionEncoderConfig()
	encoderConfig.EncodeTime = zapcore.ISO8601TimeEncoder
	encoderConfig.EncodeLevel = zapcore.CapitalLevelEncoder
	return zapcore.NewConsoleEncoder(encoderConfig)
}

// 2.WriterSyncer ：指定日志将写到哪里去。
func getLogWriterOld() zapcore.WriteSyncer {
	file, _ := os.Create("./internal/utils/zap/zap.log")
	// 利用io.MultiWriter 支持文件和终端两个输出目标
	ws := io.MultiWriter(file, os.Stdout)
	return zapcore.AddSync(ws)
}

// 支持按照时间来进行切割日志
func getLogWriter() zapcore.WriteSyncer {
	lumberJackLogger := &lumberjack.Logger{
		Filename:   "./internal/utils/zap/zap.log", //: 日志文件的位置
		MaxSize:    100,                            //：在进行切割之前，日志文件的最大大小（以MB为单位）
		MaxBackups: 10,                             //：保留旧文件的最大个数
		MaxAge:     30,                             //：保留旧文件的最大天数
		Compress:   false,                          //：是否压缩/归档旧文件
	}
	return zapcore.AddSync(lumberJackLogger)
}

func getLogWriterErr() zapcore.WriteSyncer {
	lumberJackLogger := &lumberjack.Logger{
		Filename:   "./internal/utils/zap/zap.err.log",
		MaxSize:    100,
		MaxBackups: 10,
		MaxAge:     30,
		Compress:   false,
	}
	return zapcore.AddSync(lumberJackLogger)
}

//3.Log Level：哪种级别的日志将被写入。
